Spring的 Resource
接口提供了对底层资源更强大的访问能力。
public interface Resource extends InputStreamSource {
boolean exists();
boolean isOpen();
URL getURL() throws IOException;
File getFile() throws IOException;
Resource createRelative(String relativePath) throws IOException;
String getFilename();
String getDescription();
}
public interface InputStreamSource {
InputStream getInputStream() throws IOException;
}
Resource
接口中一些重要的方法:
getInputStream()
:定位并打开资源,从资源中读取Inputstream
并返回。每次调用都会返回一个新的InputStream
。方法的调用者有责任去关闭输出流。
exists()
:返回一个Boolean
值指明这个资源是否存在。
isOpen()
:返回一个Boolean
值指明这个资源是否有打开的句柄。 如果为true,则这个InputStream
不能被读取多次,而只能读取一次,并且需要关闭以免资源泄漏。 对于绝大部分的的Resource的实现返回值都是false
的,除了InputStreamResource
。
getDescription()
:返回这个资源的描述,用来在使用资源的时候输出错误。返回值通常是文件的全限定名或是实际的URL资源。
其他方法允许你获取代表这资源的URL
或File
对象(如果底层实现是允许的,且支持这个功能)。
Resource
在Spring中被广泛使用,当需要一个资源时,作为参数被传入。在Spring APIs中的一些方法(比如一些ApplicationContext
的构造函数)需要一个String
,用一个简单的方式来创建适合context实现的Resource
,或者通过String
特定的前缀来允许调用者指明将被创建和使用的特定Resource
类型。
尽管Resource
在Spring中被大量的使用,它也可以在你不知道不了解Spring其余部分内容的时候,被你在自己的代码中当作工具类用来访问资源。虽然,这会让你的代码耦合到Spring上,但这只是在工具类这一小部分发生了耦合,这些工具类将会很好的代替URL
,其他你考虑用来处理这个功能的工具类同样会是你的代码产生耦合。
值得注意的是,Respurce
并不是取代:它尽可能包装它。 例如,UrlResource
包装了一个URL,并使用包装的URL
来完成其工作。